Skip to content

Commit 7aacc62

Browse files
committed
Merge branch 'for-7.1/cxl-type2-support' into cxl-for-next
Prep patches for CXL type2 accelerator basic support cxl/region: Factor out interleave granularity setup cxl/region: Factor out interleave ways setup cxl: Make region type based on endpoint type cxl/pci: Remove redundant cxl_pci_find_port() call cxl: Move pci generic code from cxl_pci to core/cxl_pci cxl: export internal structs for external Type2 drivers cxl: support Type2 when initializing cxl_dev_state
2 parents 2fb3bde + 6458427 commit 7aacc62

12 files changed

Lines changed: 394 additions & 300 deletions

File tree

drivers/cxl/core/core.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,4 +224,6 @@ int cxl_set_feature(struct cxl_mailbox *cxl_mbox, const uuid_t *feat_uuid,
224224
u16 *return_code);
225225
#endif
226226

227+
resource_size_t cxl_rcd_component_reg_phys(struct device *dev,
228+
struct cxl_dport *dport);
227229
#endif /* __CXL_CORE_H__ */

drivers/cxl/core/mbox.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1522,23 +1522,21 @@ int cxl_mailbox_init(struct cxl_mailbox *cxl_mbox, struct device *host)
15221522
}
15231523
EXPORT_SYMBOL_NS_GPL(cxl_mailbox_init, "CXL");
15241524

1525-
struct cxl_memdev_state *cxl_memdev_state_create(struct device *dev)
1525+
struct cxl_memdev_state *cxl_memdev_state_create(struct device *dev, u64 serial,
1526+
u16 dvsec)
15261527
{
15271528
struct cxl_memdev_state *mds;
15281529
int rc;
15291530

1530-
mds = devm_kzalloc(dev, sizeof(*mds), GFP_KERNEL);
1531+
mds = devm_cxl_dev_state_create(dev, CXL_DEVTYPE_CLASSMEM, serial,
1532+
dvsec, struct cxl_memdev_state, cxlds,
1533+
true);
15311534
if (!mds) {
15321535
dev_err(dev, "No memory available\n");
15331536
return ERR_PTR(-ENOMEM);
15341537
}
15351538

15361539
mutex_init(&mds->event.log_lock);
1537-
mds->cxlds.dev = dev;
1538-
mds->cxlds.reg_map.host = dev;
1539-
mds->cxlds.cxl_mbox.host = dev;
1540-
mds->cxlds.reg_map.resource = CXL_RESOURCE_NONE;
1541-
mds->cxlds.type = CXL_DEVTYPE_CLASSMEM;
15421540

15431541
rc = devm_cxl_register_mce_notifier(dev, &mds->mce_notifier);
15441542
if (rc == -EOPNOTSUPP)

drivers/cxl/core/memdev.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,30 @@ static void detach_memdev(struct work_struct *work)
659659

660660
static struct lock_class_key cxl_memdev_key;
661661

662+
struct cxl_dev_state *_devm_cxl_dev_state_create(struct device *dev,
663+
enum cxl_devtype type,
664+
u64 serial, u16 dvsec,
665+
size_t size, bool has_mbox)
666+
{
667+
struct cxl_dev_state *cxlds = devm_kzalloc(dev, size, GFP_KERNEL);
668+
669+
if (!cxlds)
670+
return NULL;
671+
672+
cxlds->dev = dev;
673+
cxlds->type = type;
674+
cxlds->serial = serial;
675+
cxlds->cxl_dvsec = dvsec;
676+
cxlds->reg_map.host = dev;
677+
cxlds->reg_map.resource = CXL_RESOURCE_NONE;
678+
679+
if (has_mbox)
680+
cxlds->cxl_mbox.host = dev;
681+
682+
return cxlds;
683+
}
684+
EXPORT_SYMBOL_NS_GPL(_devm_cxl_dev_state_create, "CXL");
685+
662686
static struct cxl_memdev *cxl_memdev_alloc(struct cxl_dev_state *cxlds,
663687
const struct file_operations *fops,
664688
const struct cxl_memdev_attach *attach)

drivers/cxl/core/pci.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,63 @@ bool cxl_endpoint_decoder_reset_detected(struct cxl_port *port)
696696
}
697697
EXPORT_SYMBOL_NS_GPL(cxl_endpoint_decoder_reset_detected, "CXL");
698698

699+
static int cxl_rcrb_get_comp_regs(struct pci_dev *pdev,
700+
struct cxl_register_map *map,
701+
struct cxl_dport *dport)
702+
{
703+
resource_size_t component_reg_phys;
704+
705+
*map = (struct cxl_register_map) {
706+
.host = &pdev->dev,
707+
.resource = CXL_RESOURCE_NONE,
708+
};
709+
710+
component_reg_phys = cxl_rcd_component_reg_phys(&pdev->dev, dport);
711+
if (component_reg_phys == CXL_RESOURCE_NONE)
712+
return -ENXIO;
713+
714+
map->resource = component_reg_phys;
715+
map->reg_type = CXL_REGLOC_RBI_COMPONENT;
716+
map->max_size = CXL_COMPONENT_REG_BLOCK_SIZE;
717+
718+
return 0;
719+
}
720+
721+
int cxl_pci_setup_regs(struct pci_dev *pdev, enum cxl_regloc_type type,
722+
struct cxl_register_map *map)
723+
{
724+
int rc;
725+
726+
rc = cxl_find_regblock(pdev, type, map);
727+
728+
/*
729+
* If the Register Locator DVSEC does not exist, check if it
730+
* is an RCH and try to extract the Component Registers from
731+
* an RCRB.
732+
*/
733+
if (rc && type == CXL_REGLOC_RBI_COMPONENT && is_cxl_restricted(pdev)) {
734+
struct cxl_dport *dport;
735+
struct cxl_port *port __free(put_cxl_port) =
736+
cxl_pci_find_port(pdev, &dport);
737+
if (!port)
738+
return -EPROBE_DEFER;
739+
740+
rc = cxl_rcrb_get_comp_regs(pdev, map, dport);
741+
if (rc)
742+
return rc;
743+
744+
rc = cxl_dport_map_rcd_linkcap(pdev, dport);
745+
if (rc)
746+
return rc;
747+
748+
} else if (rc) {
749+
return rc;
750+
}
751+
752+
return cxl_setup_regs(map);
753+
}
754+
EXPORT_SYMBOL_NS_GPL(cxl_pci_setup_regs, "CXL");
755+
699756
int cxl_pci_get_bandwidth(struct pci_dev *pdev, struct access_coordinate *c)
700757
{
701758
int speed, bw;

drivers/cxl/core/region.c

Lines changed: 56 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -485,22 +485,14 @@ static ssize_t interleave_ways_show(struct device *dev,
485485

486486
static const struct attribute_group *get_cxl_region_target_group(void);
487487

488-
static ssize_t interleave_ways_store(struct device *dev,
489-
struct device_attribute *attr,
490-
const char *buf, size_t len)
488+
static int set_interleave_ways(struct cxl_region *cxlr, int val)
491489
{
492-
struct cxl_region *cxlr = to_cxl_region(dev);
493490
struct cxl_root_decoder *cxlrd = cxlr->cxlrd;
494491
struct cxl_decoder *cxld = &cxlrd->cxlsd.cxld;
495492
struct cxl_region_params *p = &cxlr->params;
496-
unsigned int val, save;
497-
int rc;
493+
int save, rc;
498494
u8 iw;
499495

500-
rc = kstrtouint(buf, 0, &val);
501-
if (rc)
502-
return rc;
503-
504496
rc = ways_to_eiw(val, &iw);
505497
if (rc)
506498
return rc;
@@ -515,20 +507,39 @@ static ssize_t interleave_ways_store(struct device *dev,
515507
return -EINVAL;
516508
}
517509

518-
ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region);
519-
if ((rc = ACQUIRE_ERR(rwsem_write_kill, &rwsem)))
520-
return rc;
510+
lockdep_assert_held_write(&cxl_rwsem.region);
521511

522512
if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE)
523513
return -EBUSY;
524514

525515
save = p->interleave_ways;
526516
p->interleave_ways = val;
527517
rc = sysfs_update_group(&cxlr->dev.kobj, get_cxl_region_target_group());
528-
if (rc) {
518+
if (rc)
529519
p->interleave_ways = save;
520+
521+
return rc;
522+
}
523+
524+
static ssize_t interleave_ways_store(struct device *dev,
525+
struct device_attribute *attr,
526+
const char *buf, size_t len)
527+
{
528+
struct cxl_region *cxlr = to_cxl_region(dev);
529+
int val;
530+
int rc;
531+
532+
rc = kstrtoint(buf, 0, &val);
533+
if (rc)
534+
return rc;
535+
536+
ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region);
537+
if ((rc = ACQUIRE_ERR(rwsem_write_kill, &rwsem)))
538+
return rc;
539+
540+
rc = set_interleave_ways(cxlr, val);
541+
if (rc)
530542
return rc;
531-
}
532543

533544
return len;
534545
}
@@ -548,21 +559,14 @@ static ssize_t interleave_granularity_show(struct device *dev,
548559
return sysfs_emit(buf, "%d\n", p->interleave_granularity);
549560
}
550561

551-
static ssize_t interleave_granularity_store(struct device *dev,
552-
struct device_attribute *attr,
553-
const char *buf, size_t len)
562+
static int set_interleave_granularity(struct cxl_region *cxlr, int val)
554563
{
555-
struct cxl_region *cxlr = to_cxl_region(dev);
556564
struct cxl_root_decoder *cxlrd = cxlr->cxlrd;
557565
struct cxl_decoder *cxld = &cxlrd->cxlsd.cxld;
558566
struct cxl_region_params *p = &cxlr->params;
559-
int rc, val;
567+
int rc;
560568
u16 ig;
561569

562-
rc = kstrtoint(buf, 0, &val);
563-
if (rc)
564-
return rc;
565-
566570
rc = granularity_to_eig(val, &ig);
567571
if (rc)
568572
return rc;
@@ -578,14 +582,33 @@ static ssize_t interleave_granularity_store(struct device *dev,
578582
if (cxld->interleave_ways > 1 && val != cxld->interleave_granularity)
579583
return -EINVAL;
580584

581-
ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region);
582-
if ((rc = ACQUIRE_ERR(rwsem_write_kill, &rwsem)))
583-
return rc;
585+
lockdep_assert_held_write(&cxl_rwsem.region);
584586

585587
if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE)
586588
return -EBUSY;
587589

588590
p->interleave_granularity = val;
591+
return 0;
592+
}
593+
594+
static ssize_t interleave_granularity_store(struct device *dev,
595+
struct device_attribute *attr,
596+
const char *buf, size_t len)
597+
{
598+
struct cxl_region *cxlr = to_cxl_region(dev);
599+
int rc, val;
600+
601+
rc = kstrtoint(buf, 0, &val);
602+
if (rc)
603+
return rc;
604+
605+
ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region);
606+
if ((rc = ACQUIRE_ERR(rwsem_write_kill, &rwsem)))
607+
return rc;
608+
609+
rc = set_interleave_granularity(cxlr, val);
610+
if (rc)
611+
return rc;
589612

590613
return len;
591614
}
@@ -2667,7 +2690,8 @@ static ssize_t create_ram_region_show(struct device *dev,
26672690
}
26682691

26692692
static struct cxl_region *__create_region(struct cxl_root_decoder *cxlrd,
2670-
enum cxl_partition_mode mode, int id)
2693+
enum cxl_partition_mode mode, int id,
2694+
enum cxl_decoder_type target_type)
26712695
{
26722696
int rc;
26732697

@@ -2689,7 +2713,7 @@ static struct cxl_region *__create_region(struct cxl_root_decoder *cxlrd,
26892713
return ERR_PTR(-EBUSY);
26902714
}
26912715

2692-
return devm_cxl_add_region(cxlrd, id, mode, CXL_DECODER_HOSTONLYMEM);
2716+
return devm_cxl_add_region(cxlrd, id, mode, target_type);
26932717
}
26942718

26952719
static ssize_t create_region_store(struct device *dev, const char *buf,
@@ -2703,7 +2727,7 @@ static ssize_t create_region_store(struct device *dev, const char *buf,
27032727
if (rc != 1)
27042728
return -EINVAL;
27052729

2706-
cxlr = __create_region(cxlrd, mode, id);
2730+
cxlr = __create_region(cxlrd, mode, id, CXL_DECODER_HOSTONLYMEM);
27072731
if (IS_ERR(cxlr))
27082732
return PTR_ERR(cxlr);
27092733

@@ -3921,7 +3945,8 @@ static struct cxl_region *construct_region(struct cxl_root_decoder *cxlrd,
39213945

39223946
do {
39233947
cxlr = __create_region(cxlrd, cxlds->part[part].mode,
3924-
atomic_read(&cxlrd->region_id));
3948+
atomic_read(&cxlrd->region_id),
3949+
cxled->cxld.target_type);
39253950
} while (IS_ERR(cxlr) && PTR_ERR(cxlr) == -EBUSY);
39263951

39273952
if (IS_ERR(cxlr)) {

drivers/cxl/core/regs.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,4 +641,3 @@ resource_size_t cxl_rcd_component_reg_phys(struct device *dev,
641641
return CXL_RESOURCE_NONE;
642642
return __rcrb_to_component(dev, &dport->rcrb, CXL_RCRB_UPSTREAM);
643643
}
644-
EXPORT_SYMBOL_NS_GPL(cxl_rcd_component_reg_phys, "CXL");

0 commit comments

Comments
 (0)