162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  dcdbas.h: Definitions for Dell Systems Management Base driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 1995-2005 Dell Inc.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _DCDBAS_H_
962306a36Sopenharmony_ci#define _DCDBAS_H_
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/device.h>
1262306a36Sopenharmony_ci#include <linux/sysfs.h>
1362306a36Sopenharmony_ci#include <linux/types.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define MAX_SMI_DATA_BUF_SIZE			(256 * 1024)
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define HC_ACTION_NONE				(0)
1862306a36Sopenharmony_ci#define HC_ACTION_HOST_CONTROL_POWEROFF		BIT(1)
1962306a36Sopenharmony_ci#define HC_ACTION_HOST_CONTROL_POWERCYCLE	BIT(2)
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#define HC_SMITYPE_NONE				(0)
2262306a36Sopenharmony_ci#define HC_SMITYPE_TYPE1			(1)
2362306a36Sopenharmony_ci#define HC_SMITYPE_TYPE2			(2)
2462306a36Sopenharmony_ci#define HC_SMITYPE_TYPE3			(3)
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define ESM_APM_CMD				(0x0A0)
2762306a36Sopenharmony_ci#define ESM_APM_POWER_CYCLE			(0x10)
2862306a36Sopenharmony_ci#define ESM_STATUS_CMD_UNSUCCESSFUL		(-1)
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#define CMOS_BASE_PORT				(0x070)
3162306a36Sopenharmony_ci#define CMOS_PAGE1_INDEX_PORT			(0)
3262306a36Sopenharmony_ci#define CMOS_PAGE1_DATA_PORT			(1)
3362306a36Sopenharmony_ci#define CMOS_PAGE2_INDEX_PORT_PIIX4		(2)
3462306a36Sopenharmony_ci#define CMOS_PAGE2_DATA_PORT_PIIX4		(3)
3562306a36Sopenharmony_ci#define PE1400_APM_CONTROL_PORT			(0x0B0)
3662306a36Sopenharmony_ci#define PCAT_APM_CONTROL_PORT			(0x0B2)
3762306a36Sopenharmony_ci#define PCAT_APM_STATUS_PORT			(0x0B3)
3862306a36Sopenharmony_ci#define PE1300_CMOS_CMD_STRUCT_PTR		(0x38)
3962306a36Sopenharmony_ci#define PE1400_CMOS_CMD_STRUCT_PTR		(0x70)
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define MAX_SYSMGMT_SHORTCMD_PARMBUF_LEN	(14)
4262306a36Sopenharmony_ci#define MAX_SYSMGMT_LONGCMD_SGENTRY_NUM		(16)
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define TIMEOUT_USEC_SHORT_SEMA_BLOCKING	(10000)
4562306a36Sopenharmony_ci#define EXPIRED_TIMER				(0)
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#define SMI_CMD_MAGIC				(0x534D4931)
4862306a36Sopenharmony_ci#define SMM_EPS_SIG				"$SCB"
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#define DCDBAS_DEV_ATTR_RW(_name) \
5162306a36Sopenharmony_ci	DEVICE_ATTR(_name,0600,_name##_show,_name##_store);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#define DCDBAS_DEV_ATTR_RO(_name) \
5462306a36Sopenharmony_ci	DEVICE_ATTR(_name,0400,_name##_show,NULL);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#define DCDBAS_DEV_ATTR_WO(_name) \
5762306a36Sopenharmony_ci	DEVICE_ATTR(_name,0200,NULL,_name##_store);
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define DCDBAS_BIN_ATTR_RW(_name) \
6062306a36Sopenharmony_cistruct bin_attribute bin_attr_##_name = { \
6162306a36Sopenharmony_ci	.attr =  { .name = __stringify(_name), \
6262306a36Sopenharmony_ci		   .mode = 0600 }, \
6362306a36Sopenharmony_ci	.read =  _name##_read, \
6462306a36Sopenharmony_ci	.write = _name##_write, \
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistruct smi_cmd {
6862306a36Sopenharmony_ci	__u32 magic;
6962306a36Sopenharmony_ci	__u32 ebx;
7062306a36Sopenharmony_ci	__u32 ecx;
7162306a36Sopenharmony_ci	__u16 command_address;
7262306a36Sopenharmony_ci	__u8 command_code;
7362306a36Sopenharmony_ci	__u8 reserved;
7462306a36Sopenharmony_ci	__u8 command_buffer[1];
7562306a36Sopenharmony_ci} __attribute__ ((packed));
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistruct apm_cmd {
7862306a36Sopenharmony_ci	__u8 command;
7962306a36Sopenharmony_ci	__s8 status;
8062306a36Sopenharmony_ci	__u16 reserved;
8162306a36Sopenharmony_ci	union {
8262306a36Sopenharmony_ci		struct {
8362306a36Sopenharmony_ci			__u8 parm[MAX_SYSMGMT_SHORTCMD_PARMBUF_LEN];
8462306a36Sopenharmony_ci		} __attribute__ ((packed)) shortreq;
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci		struct {
8762306a36Sopenharmony_ci			__u16 num_sg_entries;
8862306a36Sopenharmony_ci			struct {
8962306a36Sopenharmony_ci				__u32 size;
9062306a36Sopenharmony_ci				__u64 addr;
9162306a36Sopenharmony_ci			} __attribute__ ((packed))
9262306a36Sopenharmony_ci			    sglist[MAX_SYSMGMT_LONGCMD_SGENTRY_NUM];
9362306a36Sopenharmony_ci		} __attribute__ ((packed)) longreq;
9462306a36Sopenharmony_ci	} __attribute__ ((packed)) parameters;
9562306a36Sopenharmony_ci} __attribute__ ((packed));
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ciint dcdbas_smi_request(struct smi_cmd *smi_cmd);
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistruct smm_eps_table {
10062306a36Sopenharmony_ci	char smm_comm_buff_anchor[4];
10162306a36Sopenharmony_ci	u8 length;
10262306a36Sopenharmony_ci	u8 checksum;
10362306a36Sopenharmony_ci	u8 version;
10462306a36Sopenharmony_ci	u64 smm_comm_buff_addr;
10562306a36Sopenharmony_ci	u64 num_of_4k_pages;
10662306a36Sopenharmony_ci} __packed;
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_cistruct smi_buffer {
10962306a36Sopenharmony_ci	u8 *virt;
11062306a36Sopenharmony_ci	unsigned long size;
11162306a36Sopenharmony_ci	dma_addr_t dma;
11262306a36Sopenharmony_ci};
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ciint dcdbas_smi_alloc(struct smi_buffer *smi_buffer, unsigned long size);
11562306a36Sopenharmony_civoid dcdbas_smi_free(struct smi_buffer *smi_buffer);
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci#endif /* _DCDBAS_H_ */
11862306a36Sopenharmony_ci
119