162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _VSEC_H
362306a36Sopenharmony_ci#define _VSEC_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/auxiliary_bus.h>
662306a36Sopenharmony_ci#include <linux/bits.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#define VSEC_CAP_TELEMETRY	BIT(0)
962306a36Sopenharmony_ci#define VSEC_CAP_WATCHER	BIT(1)
1062306a36Sopenharmony_ci#define VSEC_CAP_CRASHLOG	BIT(2)
1162306a36Sopenharmony_ci#define VSEC_CAP_SDSI		BIT(3)
1262306a36Sopenharmony_ci#define VSEC_CAP_TPMI		BIT(4)
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistruct pci_dev;
1562306a36Sopenharmony_cistruct resource;
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cienum intel_vsec_quirks {
1862306a36Sopenharmony_ci	/* Watcher feature not supported */
1962306a36Sopenharmony_ci	VSEC_QUIRK_NO_WATCHER	= BIT(0),
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	/* Crashlog feature not supported */
2262306a36Sopenharmony_ci	VSEC_QUIRK_NO_CRASHLOG	= BIT(1),
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	/* Use shift instead of mask to read discovery table offset */
2562306a36Sopenharmony_ci	VSEC_QUIRK_TABLE_SHIFT	= BIT(2),
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	/* DVSEC not present (provided in driver data) */
2862306a36Sopenharmony_ci	VSEC_QUIRK_NO_DVSEC	= BIT(3),
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	/* Platforms requiring quirk in the auxiliary driver */
3162306a36Sopenharmony_ci	VSEC_QUIRK_EARLY_HW     = BIT(4),
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci/* Platform specific data */
3562306a36Sopenharmony_cistruct intel_vsec_platform_info {
3662306a36Sopenharmony_ci	struct intel_vsec_header **headers;
3762306a36Sopenharmony_ci	unsigned long caps;
3862306a36Sopenharmony_ci	unsigned long quirks;
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistruct intel_vsec_device {
4262306a36Sopenharmony_ci	struct auxiliary_device auxdev;
4362306a36Sopenharmony_ci	struct pci_dev *pcidev;
4462306a36Sopenharmony_ci	struct resource *resource;
4562306a36Sopenharmony_ci	struct ida *ida;
4662306a36Sopenharmony_ci	struct intel_vsec_platform_info *info;
4762306a36Sopenharmony_ci	int num_resources;
4862306a36Sopenharmony_ci	int id; /* xa */
4962306a36Sopenharmony_ci	void *priv_data;
5062306a36Sopenharmony_ci	size_t priv_data_size;
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ciint intel_vsec_add_aux(struct pci_dev *pdev, struct device *parent,
5462306a36Sopenharmony_ci		       struct intel_vsec_device *intel_vsec_dev,
5562306a36Sopenharmony_ci		       const char *name);
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistatic inline struct intel_vsec_device *dev_to_ivdev(struct device *dev)
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci	return container_of(dev, struct intel_vsec_device, auxdev.dev);
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic inline struct intel_vsec_device *auxdev_to_ivdev(struct auxiliary_device *auxdev)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	return container_of(auxdev, struct intel_vsec_device, auxdev);
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci#endif
67