sbridge_dev
pvt->sbridge_dev->source_id = SOURCE_ID_KNL(reg);
pvt->sbridge_dev->source_id = SOURCE_ID(reg);
pvt->sbridge_dev->source_id,
pvt->sbridge_dev->dom, i);
pvt->sbridge_dev->mc, pvt->sbridge_dev->dom, i, j,
pvt->sbridge_dev->source_id, pvt->sbridge_dev->dom, i, j);
pvt->sbridge_dev->node_id = pvt->info.get_node_id(pvt);
pvt->sbridge_dev->mc,
pvt->sbridge_dev->node_id,
pvt->sbridge_dev->source_id);
struct sbridge_dev *sbridge_dev;
list_for_each_entry(sbridge_dev, &sbridge_edac_list, list) {
if (sbridge_dev->node_id == node_id && sbridge_dev->dom == ha)
return sbridge_dev->mci;
pvt->sbridge_dev->mc,
static void sbridge_put_devices(struct sbridge_dev *sbridge_dev)
for (i = 0; i < sbridge_dev->n_devs; i++) {
struct pci_dev *pdev = sbridge_dev->pdev[i];
struct sbridge_dev *sbridge_dev, *tmp;
list_for_each_entry_safe(sbridge_dev, tmp, &sbridge_edac_list, list) {
sbridge_put_devices(sbridge_dev);
free_sbridge_dev(sbridge_dev);
struct sbridge_dev *sbridge_dev = NULL;
sbridge_dev = get_sbridge_dev(seg, bus, dev_descr->dom,
multi_bus, sbridge_dev);
if (!sbridge_dev) {
sbridge_dev = alloc_sbridge_dev(seg, bus, dev_descr->dom, table);
if (!sbridge_dev) {
if (sbridge_dev->pdev[sbridge_dev->i_devs]) {
sbridge_dev->pdev[sbridge_dev->i_devs++] = pdev;
struct sbridge_dev *sbridge_dev)
for (i = 0; i < sbridge_dev->n_devs; i++) {
pdev = sbridge_dev->pdev[i];
sbridge_dev->bus,
struct sbridge_dev *sbridge_dev)
for (i = 0; i < sbridge_dev->n_devs; i++) {
pdev = sbridge_dev->pdev[i];
sbridge_dev->bus,
struct sbridge_dev *sbridge_dev)
for (i = 0; i < sbridge_dev->n_devs; i++) {
pdev = sbridge_dev->pdev[i];
sbridge_dev->bus,
struct sbridge_dev *sbridge_dev)
for (i = 0; i < sbridge_dev->n_devs; i++) {
pdev = sbridge_dev->pdev[i];
sbridge_dev->bus,
struct sbridge_dev *sbridge_dev)
for (i = 0; i < sbridge_dev->n_devs; i++) {
pdev = sbridge_dev->pdev[i];
static void sbridge_unregister_mci(struct sbridge_dev *sbridge_dev)
struct mem_ctl_info *mci = sbridge_dev->mci;
edac_dbg(0, "MC: dev = %p\n", &sbridge_dev->pdev[0]->dev);
mci, &sbridge_dev->pdev[0]->dev);
sbridge_dev->mci = NULL;
static int sbridge_register_mci(struct sbridge_dev *sbridge_dev, enum type type)
struct pci_dev *pdev = sbridge_dev->pdev[0];
mci = edac_mc_alloc(sbridge_dev->mc, ARRAY_SIZE(layers), layers,
pvt->sbridge_dev = sbridge_dev;
sbridge_dev->mci = mci;
rc = ibridge_mci_bind_devs(mci, sbridge_dev);
pvt->sbridge_dev->source_id, pvt->sbridge_dev->dom);
rc = sbridge_mci_bind_devs(mci, sbridge_dev);
pvt->sbridge_dev->source_id, pvt->sbridge_dev->dom);
rc = haswell_mci_bind_devs(mci, sbridge_dev);
pvt->sbridge_dev->source_id, pvt->sbridge_dev->dom);
rc = broadwell_mci_bind_devs(mci, sbridge_dev);
pvt->sbridge_dev->source_id, pvt->sbridge_dev->dom);
rc = knl_mci_bind_devs(mci, sbridge_dev);
pvt->sbridge_dev->source_id, pvt->sbridge_dev->dom);
sbridge_dev->mci = NULL;
struct sbridge_dev *sbridge_dev;
list_for_each_entry(sbridge_dev, &sbridge_edac_list, list) {
sbridge_dev->mc = mc++;
rc = sbridge_register_mci(sbridge_dev, ptable->type);
list_for_each_entry(sbridge_dev, &sbridge_edac_list, list)
sbridge_unregister_mci(sbridge_dev);
struct sbridge_dev *sbridge_dev;
list_for_each_entry(sbridge_dev, &sbridge_edac_list, list)
sbridge_unregister_mci(sbridge_dev);
struct sbridge_dev *sbridge_dev;
static struct sbridge_dev *get_sbridge_dev(int seg, u8 bus, enum domain dom,
struct sbridge_dev *prev)
struct sbridge_dev *sbridge_dev;
struct sbridge_dev, list);
sbridge_dev = list_entry(prev ? prev->list.next
: sbridge_edac_list.next, struct sbridge_dev, list);
list_for_each_entry_from(sbridge_dev, &sbridge_edac_list, list) {
if ((sbridge_dev->seg == seg) && (sbridge_dev->bus == bus) &&
(dom == SOCK || dom == sbridge_dev->dom))
return sbridge_dev;
static struct sbridge_dev *alloc_sbridge_dev(int seg, u8 bus, enum domain dom,
struct sbridge_dev *sbridge_dev;
sbridge_dev = kzalloc_obj(*sbridge_dev);
if (!sbridge_dev)
sbridge_dev->pdev = kzalloc_objs(*sbridge_dev->pdev,
if (!sbridge_dev->pdev) {
kfree(sbridge_dev);
sbridge_dev->seg = seg;
sbridge_dev->bus = bus;
sbridge_dev->dom = dom;
sbridge_dev->n_devs = table->n_devs_per_imc;
list_add_tail(&sbridge_dev->list, &sbridge_edac_list);
return sbridge_dev;
static void free_sbridge_dev(struct sbridge_dev *sbridge_dev)
list_del(&sbridge_dev->list);
kfree(sbridge_dev->pdev);
kfree(sbridge_dev);