Re: [PATCH V7 5/5] platform/x86: Intel PMT Crashlog capability driver

From: Andy Shevchenko
Date: Thu Oct 01 2020 - 12:36:02 EST


On Thu, Oct 1, 2020 at 4:43 AM David E. Box <david.e.box@xxxxxxxxxxxxxxx> wrote:
> Add support for the Intel Platform Monitoring Technology crashlog
> interface. This interface provides a few sysfs values to allow for
> controlling the crashlog telemetry interface as well as a character driver
> to allow for mapping the crashlog memory region so that it can be accessed
> after a crashlog has been recorded.
>
> This driver is meant to only support the server version of the crashlog
> which is identified as crash_type 1 with a version of zero. Currently no
> other types are supported.

...

> + The crashlog<x> directory contains files for configuring an
> + instance of a PMT crashlog device that can perform crash data
> + recoring. Each crashlog<x> device has an associated crashlog

recording

> + file. This file can be opened and mapped or read to access the
> + resulting crashlog buffer. The register layout for the buffer
> + can be determined from an XML file of specified guid for the
> + parent device.

...

> + (RO) The guid for this crashlog device. The guid identifies the

guid -> GUID

Please, spell check all ABI files in this series.

...

> +config INTEL_PMT_CRASHLOG
> + tristate "Intel Platform Monitoring Technology (PMT) Crashlog driver"
> + select INTEL_PMT_CLASS
> + help
> + The Intel Platform Monitoring Technology (PMT) crashlog driver provides
> + access to hardware crashlog capabilities on devices that support the
> + feature.

Name of the module?

...

> + /*

> + * Currenty we only recognize OOBMSM version 0 devices.

Currently. Please spell check all comments in the code.

> + * We can ignore all other crashlog devices in the system.
> + */

...

> + /* clear control bits */

What new information readers get from this comment?

> + control &= ~(CRASHLOG_FLAG_MASK | CRASHLOG_FLAG_DISABLE);

How does the second constant play any role here?

...

> + /* clear control bits */

Ditto. And moreover it's ambiguous due to joined two lines below.

> + control &= ~CRASHLOG_FLAG_MASK;
> + control |= CRASHLOG_FLAG_EXECUTE;

...

> + return strnlen(buf, count);

How is this different to count?

...

> + struct crashlog_entry *entry;
> + bool trigger;
> + int result;
> +

> + entry = dev_get_drvdata(dev);

You may reduce LOCs by direct assigning in the definition block above.

...

> + result = strnlen(buf, count);

How is it different from count?

...

> +static DEFINE_XARRAY_ALLOC(crashlog_array);
> +static struct intel_pmt_namespace pmt_crashlog_ns = {
> + .name = "crashlog",
> + .xa = &crashlog_array,
> + .attr_grp = &pmt_crashlog_group

Leave the comma here.

> +};

...

> + ret = intel_pmt_dev_create(entry, &pmt_crashlog_ns, parent);
> + if (!ret)
> + return 0;
> +
> + dev_err(parent, "Failed to add crashlog controls\n");
> + intel_pmt_dev_destroy(entry, &pmt_crashlog_ns);
> +
> + return ret;

Can we use traditional patterns?
if (ret) {
...
}
return ret;

...

> + size = offsetof(struct pmt_crashlog_priv, entry[pdev->num_resources]);
> + priv = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
> + if (!priv)
> + return -ENOMEM;

struct_size()

...

> + /* initialize control mutex */
> + mutex_init(&priv->entry[i].control_mutex);
> +
> + disc_res = platform_get_resource(pdev, IORESOURCE_MEM, i);
> + if (!disc_res)
> + goto abort_probe;
> +
> + ret = intel_pmt_ioremap_discovery_table(entry, pdev, i);
> + if (ret)
> + goto abort_probe;
> +
> + if (!pmt_crashlog_supported(entry))
> + continue;
> +
> + ret = pmt_crashlog_add_entry(entry, &pdev->dev, disc_res);
> + if (ret)
> + goto abort_probe;
> +
> + priv->num_entries++;

Are you going to duplicate this in each driver? Consider to refactor
to avoid duplication of a lot of code.

...

> + .name = DRV_NAME,

> +MODULE_ALIAS("platform:" DRV_NAME);

I'm not sure I have interpreted this:
- Use 'raw' string instead of defines for device names
correctly. Can you elaborate?

--
With Best Regards,
Andy Shevchenko