cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

intel_scu_ipc.c (19387B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Driver for the Intel SCU IPC mechanism
      4 *
      5 * (C) Copyright 2008-2010,2015 Intel Corporation
      6 * Author: Sreedhara DS (sreedhara.ds@intel.com)
      7 *
      8 * SCU running in ARC processor communicates with other entity running in IA
      9 * core through IPC mechanism which in turn messaging between IA core ad SCU.
     10 * SCU has two IPC mechanism IPC-1 and IPC-2. IPC-1 is used between IA32 and
     11 * SCU where IPC-2 is used between P-Unit and SCU. This driver delas with
     12 * IPC-1 Driver provides an API for power control unit registers (e.g. MSIC)
     13 * along with other APIs.
     14 */
     15
     16#include <linux/delay.h>
     17#include <linux/device.h>
     18#include <linux/errno.h>
     19#include <linux/init.h>
     20#include <linux/interrupt.h>
     21#include <linux/io.h>
     22#include <linux/module.h>
     23#include <linux/slab.h>
     24
     25#include <asm/intel_scu_ipc.h>
     26
     27/* IPC defines the following message types */
     28#define IPCMSG_PCNTRL         0xff /* Power controller unit read/write */
     29
     30/* Command id associated with message IPCMSG_PCNTRL */
     31#define IPC_CMD_PCNTRL_W      0 /* Register write */
     32#define IPC_CMD_PCNTRL_R      1 /* Register read */
     33#define IPC_CMD_PCNTRL_M      2 /* Register read-modify-write */
     34
     35/*
     36 * IPC register summary
     37 *
     38 * IPC register blocks are memory mapped at fixed address of PCI BAR 0.
     39 * To read or write information to the SCU, driver writes to IPC-1 memory
     40 * mapped registers. The following is the IPC mechanism
     41 *
     42 * 1. IA core cDMI interface claims this transaction and converts it to a
     43 *    Transaction Layer Packet (TLP) message which is sent across the cDMI.
     44 *
     45 * 2. South Complex cDMI block receives this message and writes it to
     46 *    the IPC-1 register block, causing an interrupt to the SCU
     47 *
     48 * 3. SCU firmware decodes this interrupt and IPC message and the appropriate
     49 *    message handler is called within firmware.
     50 */
     51
     52#define IPC_WWBUF_SIZE    20		/* IPC Write buffer Size */
     53#define IPC_RWBUF_SIZE    20		/* IPC Read buffer Size */
     54#define IPC_IOC	          0x100		/* IPC command register IOC bit */
     55
     56struct intel_scu_ipc_dev {
     57	struct device dev;
     58	struct resource mem;
     59	struct module *owner;
     60	int irq;
     61	void __iomem *ipc_base;
     62	struct completion cmd_complete;
     63};
     64
     65#define IPC_STATUS		0x04
     66#define IPC_STATUS_IRQ		BIT(2)
     67#define IPC_STATUS_ERR		BIT(1)
     68#define IPC_STATUS_BUSY		BIT(0)
     69
     70/*
     71 * IPC Write/Read Buffers:
     72 * 16 byte buffer for sending and receiving data to and from SCU.
     73 */
     74#define IPC_WRITE_BUFFER	0x80
     75#define IPC_READ_BUFFER		0x90
     76
     77/* Timeout in jiffies */
     78#define IPC_TIMEOUT		(10 * HZ)
     79
     80static struct intel_scu_ipc_dev *ipcdev; /* Only one for now */
     81static DEFINE_MUTEX(ipclock); /* lock used to prevent multiple call to SCU */
     82
     83static struct class intel_scu_ipc_class = {
     84	.name = "intel_scu_ipc",
     85	.owner = THIS_MODULE,
     86};
     87
     88/**
     89 * intel_scu_ipc_dev_get() - Get SCU IPC instance
     90 *
     91 * The recommended new API takes SCU IPC instance as parameter and this
     92 * function can be called by driver to get the instance. This also makes
     93 * sure the driver providing the IPC functionality cannot be unloaded
     94 * while the caller has the instance.
     95 *
     96 * Call intel_scu_ipc_dev_put() to release the instance.
     97 *
     98 * Returns %NULL if SCU IPC is not currently available.
     99 */
    100struct intel_scu_ipc_dev *intel_scu_ipc_dev_get(void)
    101{
    102	struct intel_scu_ipc_dev *scu = NULL;
    103
    104	mutex_lock(&ipclock);
    105	if (ipcdev) {
    106		get_device(&ipcdev->dev);
    107		/*
    108		 * Prevent the IPC provider from being unloaded while it
    109		 * is being used.
    110		 */
    111		if (!try_module_get(ipcdev->owner))
    112			put_device(&ipcdev->dev);
    113		else
    114			scu = ipcdev;
    115	}
    116
    117	mutex_unlock(&ipclock);
    118	return scu;
    119}
    120EXPORT_SYMBOL_GPL(intel_scu_ipc_dev_get);
    121
    122/**
    123 * intel_scu_ipc_dev_put() - Put SCU IPC instance
    124 * @scu: SCU IPC instance
    125 *
    126 * This function releases the SCU IPC instance retrieved from
    127 * intel_scu_ipc_dev_get() and allows the driver providing IPC to be
    128 * unloaded.
    129 */
    130void intel_scu_ipc_dev_put(struct intel_scu_ipc_dev *scu)
    131{
    132	if (scu) {
    133		module_put(scu->owner);
    134		put_device(&scu->dev);
    135	}
    136}
    137EXPORT_SYMBOL_GPL(intel_scu_ipc_dev_put);
    138
    139struct intel_scu_ipc_devres {
    140	struct intel_scu_ipc_dev *scu;
    141};
    142
    143static void devm_intel_scu_ipc_dev_release(struct device *dev, void *res)
    144{
    145	struct intel_scu_ipc_devres *dr = res;
    146	struct intel_scu_ipc_dev *scu = dr->scu;
    147
    148	intel_scu_ipc_dev_put(scu);
    149}
    150
    151/**
    152 * devm_intel_scu_ipc_dev_get() - Allocate managed SCU IPC device
    153 * @dev: Device requesting the SCU IPC device
    154 *
    155 * The recommended new API takes SCU IPC instance as parameter and this
    156 * function can be called by driver to get the instance. This also makes
    157 * sure the driver providing the IPC functionality cannot be unloaded
    158 * while the caller has the instance.
    159 *
    160 * Returns %NULL if SCU IPC is not currently available.
    161 */
    162struct intel_scu_ipc_dev *devm_intel_scu_ipc_dev_get(struct device *dev)
    163{
    164	struct intel_scu_ipc_devres *dr;
    165	struct intel_scu_ipc_dev *scu;
    166
    167	dr = devres_alloc(devm_intel_scu_ipc_dev_release, sizeof(*dr), GFP_KERNEL);
    168	if (!dr)
    169		return NULL;
    170
    171	scu = intel_scu_ipc_dev_get();
    172	if (!scu) {
    173		devres_free(dr);
    174		return NULL;
    175	}
    176
    177	dr->scu = scu;
    178	devres_add(dev, dr);
    179
    180	return scu;
    181}
    182EXPORT_SYMBOL_GPL(devm_intel_scu_ipc_dev_get);
    183
    184/*
    185 * Send ipc command
    186 * Command Register (Write Only):
    187 * A write to this register results in an interrupt to the SCU core processor
    188 * Format:
    189 * |rfu2(8) | size(8) | command id(4) | rfu1(3) | ioc(1) | command(8)|
    190 */
    191static inline void ipc_command(struct intel_scu_ipc_dev *scu, u32 cmd)
    192{
    193	reinit_completion(&scu->cmd_complete);
    194	writel(cmd | IPC_IOC, scu->ipc_base);
    195}
    196
    197/*
    198 * Write ipc data
    199 * IPC Write Buffer (Write Only):
    200 * 16-byte buffer for sending data associated with IPC command to
    201 * SCU. Size of the data is specified in the IPC_COMMAND_REG register
    202 */
    203static inline void ipc_data_writel(struct intel_scu_ipc_dev *scu, u32 data, u32 offset)
    204{
    205	writel(data, scu->ipc_base + IPC_WRITE_BUFFER + offset);
    206}
    207
    208/*
    209 * Status Register (Read Only):
    210 * Driver will read this register to get the ready/busy status of the IPC
    211 * block and error status of the IPC command that was just processed by SCU
    212 * Format:
    213 * |rfu3(8)|error code(8)|initiator id(8)|cmd id(4)|rfu1(2)|error(1)|busy(1)|
    214 */
    215static inline u8 ipc_read_status(struct intel_scu_ipc_dev *scu)
    216{
    217	return __raw_readl(scu->ipc_base + IPC_STATUS);
    218}
    219
    220/* Read ipc byte data */
    221static inline u8 ipc_data_readb(struct intel_scu_ipc_dev *scu, u32 offset)
    222{
    223	return readb(scu->ipc_base + IPC_READ_BUFFER + offset);
    224}
    225
    226/* Read ipc u32 data */
    227static inline u32 ipc_data_readl(struct intel_scu_ipc_dev *scu, u32 offset)
    228{
    229	return readl(scu->ipc_base + IPC_READ_BUFFER + offset);
    230}
    231
    232/* Wait till scu status is busy */
    233static inline int busy_loop(struct intel_scu_ipc_dev *scu)
    234{
    235	unsigned long end = jiffies + IPC_TIMEOUT;
    236
    237	do {
    238		u32 status;
    239
    240		status = ipc_read_status(scu);
    241		if (!(status & IPC_STATUS_BUSY))
    242			return (status & IPC_STATUS_ERR) ? -EIO : 0;
    243
    244		usleep_range(50, 100);
    245	} while (time_before(jiffies, end));
    246
    247	return -ETIMEDOUT;
    248}
    249
    250/* Wait till ipc ioc interrupt is received or timeout in 10 HZ */
    251static inline int ipc_wait_for_interrupt(struct intel_scu_ipc_dev *scu)
    252{
    253	int status;
    254
    255	if (!wait_for_completion_timeout(&scu->cmd_complete, IPC_TIMEOUT))
    256		return -ETIMEDOUT;
    257
    258	status = ipc_read_status(scu);
    259	if (status & IPC_STATUS_ERR)
    260		return -EIO;
    261
    262	return 0;
    263}
    264
    265static int intel_scu_ipc_check_status(struct intel_scu_ipc_dev *scu)
    266{
    267	return scu->irq > 0 ? ipc_wait_for_interrupt(scu) : busy_loop(scu);
    268}
    269
    270/* Read/Write power control(PMIC in Langwell, MSIC in PenWell) registers */
    271static int pwr_reg_rdwr(struct intel_scu_ipc_dev *scu, u16 *addr, u8 *data,
    272			u32 count, u32 op, u32 id)
    273{
    274	int nc;
    275	u32 offset = 0;
    276	int err;
    277	u8 cbuf[IPC_WWBUF_SIZE];
    278	u32 *wbuf = (u32 *)&cbuf;
    279
    280	memset(cbuf, 0, sizeof(cbuf));
    281
    282	mutex_lock(&ipclock);
    283	if (!scu)
    284		scu = ipcdev;
    285	if (!scu) {
    286		mutex_unlock(&ipclock);
    287		return -ENODEV;
    288	}
    289
    290	for (nc = 0; nc < count; nc++, offset += 2) {
    291		cbuf[offset] = addr[nc];
    292		cbuf[offset + 1] = addr[nc] >> 8;
    293	}
    294
    295	if (id == IPC_CMD_PCNTRL_R) {
    296		for (nc = 0, offset = 0; nc < count; nc++, offset += 4)
    297			ipc_data_writel(scu, wbuf[nc], offset);
    298		ipc_command(scu, (count * 2) << 16 | id << 12 | 0 << 8 | op);
    299	} else if (id == IPC_CMD_PCNTRL_W) {
    300		for (nc = 0; nc < count; nc++, offset += 1)
    301			cbuf[offset] = data[nc];
    302		for (nc = 0, offset = 0; nc < count; nc++, offset += 4)
    303			ipc_data_writel(scu, wbuf[nc], offset);
    304		ipc_command(scu, (count * 3) << 16 | id << 12 | 0 << 8 | op);
    305	} else if (id == IPC_CMD_PCNTRL_M) {
    306		cbuf[offset] = data[0];
    307		cbuf[offset + 1] = data[1];
    308		ipc_data_writel(scu, wbuf[0], 0); /* Write wbuff */
    309		ipc_command(scu, 4 << 16 | id << 12 | 0 << 8 | op);
    310	}
    311
    312	err = intel_scu_ipc_check_status(scu);
    313	if (!err && id == IPC_CMD_PCNTRL_R) { /* Read rbuf */
    314		/* Workaround: values are read as 0 without memcpy_fromio */
    315		memcpy_fromio(cbuf, scu->ipc_base + 0x90, 16);
    316		for (nc = 0; nc < count; nc++)
    317			data[nc] = ipc_data_readb(scu, nc);
    318	}
    319	mutex_unlock(&ipclock);
    320	return err;
    321}
    322
    323/**
    324 * intel_scu_ipc_dev_ioread8() - Read a byte via the SCU
    325 * @scu: Optional SCU IPC instance
    326 * @addr: Register on SCU
    327 * @data: Return pointer for read byte
    328 *
    329 * Read a single register. Returns %0 on success or an error code. All
    330 * locking between SCU accesses is handled for the caller.
    331 *
    332 * This function may sleep.
    333 */
    334int intel_scu_ipc_dev_ioread8(struct intel_scu_ipc_dev *scu, u16 addr, u8 *data)
    335{
    336	return pwr_reg_rdwr(scu, &addr, data, 1, IPCMSG_PCNTRL, IPC_CMD_PCNTRL_R);
    337}
    338EXPORT_SYMBOL(intel_scu_ipc_dev_ioread8);
    339
    340/**
    341 * intel_scu_ipc_dev_iowrite8() - Write a byte via the SCU
    342 * @scu: Optional SCU IPC instance
    343 * @addr: Register on SCU
    344 * @data: Byte to write
    345 *
    346 * Write a single register. Returns %0 on success or an error code. All
    347 * locking between SCU accesses is handled for the caller.
    348 *
    349 * This function may sleep.
    350 */
    351int intel_scu_ipc_dev_iowrite8(struct intel_scu_ipc_dev *scu, u16 addr, u8 data)
    352{
    353	return pwr_reg_rdwr(scu, &addr, &data, 1, IPCMSG_PCNTRL, IPC_CMD_PCNTRL_W);
    354}
    355EXPORT_SYMBOL(intel_scu_ipc_dev_iowrite8);
    356
    357/**
    358 * intel_scu_ipc_dev_readv() - Read a set of registers
    359 * @scu: Optional SCU IPC instance
    360 * @addr: Register list
    361 * @data: Bytes to return
    362 * @len: Length of array
    363 *
    364 * Read registers. Returns %0 on success or an error code. All locking
    365 * between SCU accesses is handled for the caller.
    366 *
    367 * The largest array length permitted by the hardware is 5 items.
    368 *
    369 * This function may sleep.
    370 */
    371int intel_scu_ipc_dev_readv(struct intel_scu_ipc_dev *scu, u16 *addr, u8 *data,
    372			    size_t len)
    373{
    374	return pwr_reg_rdwr(scu, addr, data, len, IPCMSG_PCNTRL, IPC_CMD_PCNTRL_R);
    375}
    376EXPORT_SYMBOL(intel_scu_ipc_dev_readv);
    377
    378/**
    379 * intel_scu_ipc_dev_writev() - Write a set of registers
    380 * @scu: Optional SCU IPC instance
    381 * @addr: Register list
    382 * @data: Bytes to write
    383 * @len: Length of array
    384 *
    385 * Write registers. Returns %0 on success or an error code. All locking
    386 * between SCU accesses is handled for the caller.
    387 *
    388 * The largest array length permitted by the hardware is 5 items.
    389 *
    390 * This function may sleep.
    391 */
    392int intel_scu_ipc_dev_writev(struct intel_scu_ipc_dev *scu, u16 *addr, u8 *data,
    393			     size_t len)
    394{
    395	return pwr_reg_rdwr(scu, addr, data, len, IPCMSG_PCNTRL, IPC_CMD_PCNTRL_W);
    396}
    397EXPORT_SYMBOL(intel_scu_ipc_dev_writev);
    398
    399/**
    400 * intel_scu_ipc_dev_update() - Update a register
    401 * @scu: Optional SCU IPC instance
    402 * @addr: Register address
    403 * @data: Bits to update
    404 * @mask: Mask of bits to update
    405 *
    406 * Read-modify-write power control unit register. The first data argument
    407 * must be register value and second is mask value mask is a bitmap that
    408 * indicates which bits to update. %0 = masked. Don't modify this bit, %1 =
    409 * modify this bit. returns %0 on success or an error code.
    410 *
    411 * This function may sleep. Locking between SCU accesses is handled
    412 * for the caller.
    413 */
    414int intel_scu_ipc_dev_update(struct intel_scu_ipc_dev *scu, u16 addr, u8 data,
    415			     u8 mask)
    416{
    417	u8 tmp[2] = { data, mask };
    418	return pwr_reg_rdwr(scu, &addr, tmp, 1, IPCMSG_PCNTRL, IPC_CMD_PCNTRL_M);
    419}
    420EXPORT_SYMBOL(intel_scu_ipc_dev_update);
    421
    422/**
    423 * intel_scu_ipc_dev_simple_command() - Send a simple command
    424 * @scu: Optional SCU IPC instance
    425 * @cmd: Command
    426 * @sub: Sub type
    427 *
    428 * Issue a simple command to the SCU. Do not use this interface if you must
    429 * then access data as any data values may be overwritten by another SCU
    430 * access by the time this function returns.
    431 *
    432 * This function may sleep. Locking for SCU accesses is handled for the
    433 * caller.
    434 */
    435int intel_scu_ipc_dev_simple_command(struct intel_scu_ipc_dev *scu, int cmd,
    436				     int sub)
    437{
    438	u32 cmdval;
    439	int err;
    440
    441	mutex_lock(&ipclock);
    442	if (!scu)
    443		scu = ipcdev;
    444	if (!scu) {
    445		mutex_unlock(&ipclock);
    446		return -ENODEV;
    447	}
    448	scu = ipcdev;
    449	cmdval = sub << 12 | cmd;
    450	ipc_command(scu, cmdval);
    451	err = intel_scu_ipc_check_status(scu);
    452	mutex_unlock(&ipclock);
    453	if (err)
    454		dev_err(&scu->dev, "IPC command %#x failed with %d\n", cmdval, err);
    455	return err;
    456}
    457EXPORT_SYMBOL(intel_scu_ipc_dev_simple_command);
    458
    459/**
    460 * intel_scu_ipc_dev_command_with_size() - Command with data
    461 * @scu: Optional SCU IPC instance
    462 * @cmd: Command
    463 * @sub: Sub type
    464 * @in: Input data
    465 * @inlen: Input length in bytes
    466 * @size: Input size written to the IPC command register in whatever
    467 *	  units (dword, byte) the particular firmware requires. Normally
    468 *	  should be the same as @inlen.
    469 * @out: Output data
    470 * @outlen: Output length in bytes
    471 *
    472 * Issue a command to the SCU which involves data transfers. Do the
    473 * data copies under the lock but leave it for the caller to interpret.
    474 */
    475int intel_scu_ipc_dev_command_with_size(struct intel_scu_ipc_dev *scu, int cmd,
    476					int sub, const void *in, size_t inlen,
    477					size_t size, void *out, size_t outlen)
    478{
    479	size_t outbuflen = DIV_ROUND_UP(outlen, sizeof(u32));
    480	size_t inbuflen = DIV_ROUND_UP(inlen, sizeof(u32));
    481	u32 cmdval, inbuf[4] = {};
    482	int i, err;
    483
    484	if (inbuflen > 4 || outbuflen > 4)
    485		return -EINVAL;
    486
    487	mutex_lock(&ipclock);
    488	if (!scu)
    489		scu = ipcdev;
    490	if (!scu) {
    491		mutex_unlock(&ipclock);
    492		return -ENODEV;
    493	}
    494
    495	memcpy(inbuf, in, inlen);
    496	for (i = 0; i < inbuflen; i++)
    497		ipc_data_writel(scu, inbuf[i], 4 * i);
    498
    499	cmdval = (size << 16) | (sub << 12) | cmd;
    500	ipc_command(scu, cmdval);
    501	err = intel_scu_ipc_check_status(scu);
    502
    503	if (!err) {
    504		u32 outbuf[4] = {};
    505
    506		for (i = 0; i < outbuflen; i++)
    507			outbuf[i] = ipc_data_readl(scu, 4 * i);
    508
    509		memcpy(out, outbuf, outlen);
    510	}
    511
    512	mutex_unlock(&ipclock);
    513	if (err)
    514		dev_err(&scu->dev, "IPC command %#x failed with %d\n", cmdval, err);
    515	return err;
    516}
    517EXPORT_SYMBOL(intel_scu_ipc_dev_command_with_size);
    518
    519/*
    520 * Interrupt handler gets called when ioc bit of IPC_COMMAND_REG set to 1
    521 * When ioc bit is set to 1, caller api must wait for interrupt handler called
    522 * which in turn unlocks the caller api. Currently this is not used
    523 *
    524 * This is edge triggered so we need take no action to clear anything
    525 */
    526static irqreturn_t ioc(int irq, void *dev_id)
    527{
    528	struct intel_scu_ipc_dev *scu = dev_id;
    529	int status = ipc_read_status(scu);
    530
    531	writel(status | IPC_STATUS_IRQ, scu->ipc_base + IPC_STATUS);
    532	complete(&scu->cmd_complete);
    533
    534	return IRQ_HANDLED;
    535}
    536
    537static void intel_scu_ipc_release(struct device *dev)
    538{
    539	struct intel_scu_ipc_dev *scu;
    540
    541	scu = container_of(dev, struct intel_scu_ipc_dev, dev);
    542	if (scu->irq > 0)
    543		free_irq(scu->irq, scu);
    544	iounmap(scu->ipc_base);
    545	release_mem_region(scu->mem.start, resource_size(&scu->mem));
    546	kfree(scu);
    547}
    548
    549/**
    550 * __intel_scu_ipc_register() - Register SCU IPC device
    551 * @parent: Parent device
    552 * @scu_data: Data used to configure SCU IPC
    553 * @owner: Module registering the SCU IPC device
    554 *
    555 * Call this function to register SCU IPC mechanism under @parent.
    556 * Returns pointer to the new SCU IPC device or ERR_PTR() in case of
    557 * failure. The caller may use the returned instance if it needs to do
    558 * SCU IPC calls itself.
    559 */
    560struct intel_scu_ipc_dev *
    561__intel_scu_ipc_register(struct device *parent,
    562			 const struct intel_scu_ipc_data *scu_data,
    563			 struct module *owner)
    564{
    565	int err;
    566	struct intel_scu_ipc_dev *scu;
    567	void __iomem *ipc_base;
    568
    569	mutex_lock(&ipclock);
    570	/* We support only one IPC */
    571	if (ipcdev) {
    572		err = -EBUSY;
    573		goto err_unlock;
    574	}
    575
    576	scu = kzalloc(sizeof(*scu), GFP_KERNEL);
    577	if (!scu) {
    578		err = -ENOMEM;
    579		goto err_unlock;
    580	}
    581
    582	scu->owner = owner;
    583	scu->dev.parent = parent;
    584	scu->dev.class = &intel_scu_ipc_class;
    585	scu->dev.release = intel_scu_ipc_release;
    586	dev_set_name(&scu->dev, "intel_scu_ipc");
    587
    588	if (!request_mem_region(scu_data->mem.start, resource_size(&scu_data->mem),
    589				"intel_scu_ipc")) {
    590		err = -EBUSY;
    591		goto err_free;
    592	}
    593
    594	ipc_base = ioremap(scu_data->mem.start, resource_size(&scu_data->mem));
    595	if (!ipc_base) {
    596		err = -ENOMEM;
    597		goto err_release;
    598	}
    599
    600	scu->ipc_base = ipc_base;
    601	scu->mem = scu_data->mem;
    602	scu->irq = scu_data->irq;
    603	init_completion(&scu->cmd_complete);
    604
    605	if (scu->irq > 0) {
    606		err = request_irq(scu->irq, ioc, 0, "intel_scu_ipc", scu);
    607		if (err)
    608			goto err_unmap;
    609	}
    610
    611	/*
    612	 * After this point intel_scu_ipc_release() takes care of
    613	 * releasing the SCU IPC resources once refcount drops to zero.
    614	 */
    615	err = device_register(&scu->dev);
    616	if (err) {
    617		put_device(&scu->dev);
    618		goto err_unlock;
    619	}
    620
    621	/* Assign device at last */
    622	ipcdev = scu;
    623	mutex_unlock(&ipclock);
    624
    625	return scu;
    626
    627err_unmap:
    628	iounmap(ipc_base);
    629err_release:
    630	release_mem_region(scu_data->mem.start, resource_size(&scu_data->mem));
    631err_free:
    632	kfree(scu);
    633err_unlock:
    634	mutex_unlock(&ipclock);
    635
    636	return ERR_PTR(err);
    637}
    638EXPORT_SYMBOL_GPL(__intel_scu_ipc_register);
    639
    640/**
    641 * intel_scu_ipc_unregister() - Unregister SCU IPC
    642 * @scu: SCU IPC handle
    643 *
    644 * This unregisters the SCU IPC device and releases the acquired
    645 * resources once the refcount goes to zero.
    646 */
    647void intel_scu_ipc_unregister(struct intel_scu_ipc_dev *scu)
    648{
    649	mutex_lock(&ipclock);
    650	if (!WARN_ON(!ipcdev)) {
    651		ipcdev = NULL;
    652		device_unregister(&scu->dev);
    653	}
    654	mutex_unlock(&ipclock);
    655}
    656EXPORT_SYMBOL_GPL(intel_scu_ipc_unregister);
    657
    658static void devm_intel_scu_ipc_unregister(struct device *dev, void *res)
    659{
    660	struct intel_scu_ipc_devres *dr = res;
    661	struct intel_scu_ipc_dev *scu = dr->scu;
    662
    663	intel_scu_ipc_unregister(scu);
    664}
    665
    666/**
    667 * __devm_intel_scu_ipc_register() - Register managed SCU IPC device
    668 * @parent: Parent device
    669 * @scu_data: Data used to configure SCU IPC
    670 * @owner: Module registering the SCU IPC device
    671 *
    672 * Call this function to register managed SCU IPC mechanism under
    673 * @parent. Returns pointer to the new SCU IPC device or ERR_PTR() in
    674 * case of failure. The caller may use the returned instance if it needs
    675 * to do SCU IPC calls itself.
    676 */
    677struct intel_scu_ipc_dev *
    678__devm_intel_scu_ipc_register(struct device *parent,
    679			      const struct intel_scu_ipc_data *scu_data,
    680			      struct module *owner)
    681{
    682	struct intel_scu_ipc_devres *dr;
    683	struct intel_scu_ipc_dev *scu;
    684
    685	dr = devres_alloc(devm_intel_scu_ipc_unregister, sizeof(*dr), GFP_KERNEL);
    686	if (!dr)
    687		return NULL;
    688
    689	scu = __intel_scu_ipc_register(parent, scu_data, owner);
    690	if (IS_ERR(scu)) {
    691		devres_free(dr);
    692		return scu;
    693	}
    694
    695	dr->scu = scu;
    696	devres_add(parent, dr);
    697
    698	return scu;
    699}
    700EXPORT_SYMBOL_GPL(__devm_intel_scu_ipc_register);
    701
    702static int __init intel_scu_ipc_init(void)
    703{
    704	return class_register(&intel_scu_ipc_class);
    705}
    706subsys_initcall(intel_scu_ipc_init);
    707
    708static void __exit intel_scu_ipc_exit(void)
    709{
    710	class_unregister(&intel_scu_ipc_class);
    711}
    712module_exit(intel_scu_ipc_exit);