1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2017 Hisilicon Limited, All Rights Reserved.
4 * Author: Zhichang Yuan <yuanzhichang@hisilicon.com>
5 * Author: Zou Rongrong <zourongrong@huawei.com>
6 * Author: John Garry <john.garry@huawei.com>
9 #include <linux/acpi.h>
10 #include <linux/console.h>
11 #include <linux/delay.h>
13 #include <linux/logic_pio.h>
14 #include <linux/module.h>
16 #include <linux/of_address.h>
17 #include <linux/of_platform.h>
18 #include <linux/pci.h>
19 #include <linux/serial_8250.h>
20 #include <linux/slab.h>
22 #define DRV_NAME "hisi-lpc"
25 * Setting this bit means each IO operation will target a different port
26 * address; 0 means repeated IO operations will use the same port,
29 #define FG_INCRADDR_LPC 0x02
31 struct lpc_cycle_para
{
33 unsigned int csize
; /* data length of each operation */
37 spinlock_t cycle_lock
;
38 void __iomem
*membase
;
39 struct logic_pio_hwaddr
*io_host
;
42 /* The max IO cycle counts supported is four per operation at maximum */
43 #define LPC_MAX_DWIDTH 4
45 #define LPC_REG_STARTUP_SIGNAL 0x00
46 #define LPC_REG_STARTUP_SIGNAL_START BIT(0)
47 #define LPC_REG_OP_STATUS 0x04
48 #define LPC_REG_OP_STATUS_IDLE BIT(0)
49 #define LPC_REG_OP_STATUS_FINISHED BIT(1)
50 #define LPC_REG_OP_LEN 0x10 /* LPC cycles count per start */
51 #define LPC_REG_CMD 0x14
52 #define LPC_REG_CMD_OP BIT(0) /* 0: read, 1: write */
53 #define LPC_REG_CMD_SAMEADDR BIT(3)
54 #define LPC_REG_ADDR 0x20 /* target address */
55 #define LPC_REG_WDATA 0x24 /* write FIFO */
56 #define LPC_REG_RDATA 0x28 /* read FIFO */
58 /* The minimal nanosecond interval for each query on LPC cycle status */
59 #define LPC_NSEC_PERWAIT 100
62 * The maximum waiting time is about 128us. It is specific for stream I/O,
65 * The fastest IO cycle time is about 390ns, but the worst case will wait
66 * for extra 256 lpc clocks, so (256 + 13) * 30ns = 8 us. The maximum burst
67 * cycles is 16. So, the maximum waiting time is about 128us under worst
70 * Choose 1300 as the maximum.
72 #define LPC_MAX_WAITCNT 1300
74 /* About 10us. This is specific for single IO operations, such as inb */
75 #define LPC_PEROP_WAITCNT 100
77 static int wait_lpc_idle(void __iomem
*mbase
, unsigned int waitcnt
)
82 status
= readl(mbase
+ LPC_REG_OP_STATUS
);
83 if (status
& LPC_REG_OP_STATUS_IDLE
)
84 return (status
& LPC_REG_OP_STATUS_FINISHED
) ? 0 : -EIO
;
85 ndelay(LPC_NSEC_PERWAIT
);
92 * hisi_lpc_target_in - trigger a series of LPC cycles for read operation
93 * @lpcdev: pointer to hisi lpc device
94 * @para: some parameters used to control the lpc I/O operations
95 * @addr: the lpc I/O target port address
96 * @buf: where the read back data is stored
97 * @opcnt: how many I/O operations required, i.e. data width
99 * Returns 0 on success, non-zero on fail.
101 static int hisi_lpc_target_in(struct hisi_lpc_dev
*lpcdev
,
102 struct lpc_cycle_para
*para
, unsigned long addr
,
103 unsigned char *buf
, unsigned long opcnt
)
105 unsigned int cmd_word
;
106 unsigned int waitcnt
;
110 if (!buf
|| !opcnt
|| !para
|| !para
->csize
|| !lpcdev
)
113 cmd_word
= 0; /* IO mode, Read */
114 waitcnt
= LPC_PEROP_WAITCNT
;
115 if (!(para
->opflags
& FG_INCRADDR_LPC
)) {
116 cmd_word
|= LPC_REG_CMD_SAMEADDR
;
117 waitcnt
= LPC_MAX_WAITCNT
;
120 /* whole operation must be atomic */
121 spin_lock_irqsave(&lpcdev
->cycle_lock
, flags
);
123 writel_relaxed(opcnt
, lpcdev
->membase
+ LPC_REG_OP_LEN
);
124 writel_relaxed(cmd_word
, lpcdev
->membase
+ LPC_REG_CMD
);
125 writel_relaxed(addr
, lpcdev
->membase
+ LPC_REG_ADDR
);
127 writel(LPC_REG_STARTUP_SIGNAL_START
,
128 lpcdev
->membase
+ LPC_REG_STARTUP_SIGNAL
);
130 /* whether the operation is finished */
131 ret
= wait_lpc_idle(lpcdev
->membase
, waitcnt
);
133 spin_unlock_irqrestore(&lpcdev
->cycle_lock
, flags
);
137 readsb(lpcdev
->membase
+ LPC_REG_RDATA
, buf
, opcnt
);
139 spin_unlock_irqrestore(&lpcdev
->cycle_lock
, flags
);
145 * hisi_lpc_target_out - trigger a series of LPC cycles for write operation
146 * @lpcdev: pointer to hisi lpc device
147 * @para: some parameters used to control the lpc I/O operations
148 * @addr: the lpc I/O target port address
149 * @buf: where the data to be written is stored
150 * @opcnt: how many I/O operations required, i.e. data width
152 * Returns 0 on success, non-zero on fail.
154 static int hisi_lpc_target_out(struct hisi_lpc_dev
*lpcdev
,
155 struct lpc_cycle_para
*para
, unsigned long addr
,
156 const unsigned char *buf
, unsigned long opcnt
)
158 unsigned int waitcnt
;
163 if (!buf
|| !opcnt
|| !para
|| !lpcdev
)
166 /* default is increasing address */
167 cmd_word
= LPC_REG_CMD_OP
; /* IO mode, write */
168 waitcnt
= LPC_PEROP_WAITCNT
;
169 if (!(para
->opflags
& FG_INCRADDR_LPC
)) {
170 cmd_word
|= LPC_REG_CMD_SAMEADDR
;
171 waitcnt
= LPC_MAX_WAITCNT
;
174 spin_lock_irqsave(&lpcdev
->cycle_lock
, flags
);
176 writel_relaxed(opcnt
, lpcdev
->membase
+ LPC_REG_OP_LEN
);
177 writel_relaxed(cmd_word
, lpcdev
->membase
+ LPC_REG_CMD
);
178 writel_relaxed(addr
, lpcdev
->membase
+ LPC_REG_ADDR
);
180 writesb(lpcdev
->membase
+ LPC_REG_WDATA
, buf
, opcnt
);
182 writel(LPC_REG_STARTUP_SIGNAL_START
,
183 lpcdev
->membase
+ LPC_REG_STARTUP_SIGNAL
);
185 /* whether the operation is finished */
186 ret
= wait_lpc_idle(lpcdev
->membase
, waitcnt
);
188 spin_unlock_irqrestore(&lpcdev
->cycle_lock
, flags
);
193 static unsigned long hisi_lpc_pio_to_addr(struct hisi_lpc_dev
*lpcdev
,
196 return pio
- lpcdev
->io_host
->io_start
+ lpcdev
->io_host
->hw_start
;
200 * hisi_lpc_comm_in - input the data in a single operation
201 * @hostdata: pointer to the device information relevant to LPC controller
202 * @pio: the target I/O port address
203 * @dwidth: the data length required to read from the target I/O port
205 * When success, data is returned. Otherwise, ~0 is returned.
207 static u32
hisi_lpc_comm_in(void *hostdata
, unsigned long pio
, size_t dwidth
)
209 struct hisi_lpc_dev
*lpcdev
= hostdata
;
210 struct lpc_cycle_para iopara
;
215 if (!lpcdev
|| !dwidth
|| dwidth
> LPC_MAX_DWIDTH
)
218 addr
= hisi_lpc_pio_to_addr(lpcdev
, pio
);
220 iopara
.opflags
= FG_INCRADDR_LPC
;
221 iopara
.csize
= dwidth
;
223 ret
= hisi_lpc_target_in(lpcdev
, &iopara
, addr
,
224 (unsigned char *)&rd_data
, dwidth
);
228 return le32_to_cpu(rd_data
);
232 * hisi_lpc_comm_out - output the data in a single operation
233 * @hostdata: pointer to the device information relevant to LPC controller
234 * @pio: the target I/O port address
235 * @val: a value to be output from caller, maximum is four bytes
236 * @dwidth: the data width required writing to the target I/O port
238 * This function corresponds to out(b,w,l) only.
240 static void hisi_lpc_comm_out(void *hostdata
, unsigned long pio
,
241 u32 val
, size_t dwidth
)
243 struct hisi_lpc_dev
*lpcdev
= hostdata
;
244 struct lpc_cycle_para iopara
;
245 const unsigned char *buf
;
247 __le32 _val
= cpu_to_le32(val
);
249 if (!lpcdev
|| !dwidth
|| dwidth
> LPC_MAX_DWIDTH
)
252 buf
= (const unsigned char *)&_val
;
253 addr
= hisi_lpc_pio_to_addr(lpcdev
, pio
);
255 iopara
.opflags
= FG_INCRADDR_LPC
;
256 iopara
.csize
= dwidth
;
258 hisi_lpc_target_out(lpcdev
, &iopara
, addr
, buf
, dwidth
);
262 * hisi_lpc_comm_ins - input the data in the buffer in multiple operations
263 * @hostdata: pointer to the device information relevant to LPC controller
264 * @pio: the target I/O port address
265 * @buffer: a buffer where read/input data bytes are stored
266 * @dwidth: the data width required writing to the target I/O port
267 * @count: how many data units whose length is dwidth will be read
269 * When success, the data read back is stored in buffer pointed by buffer.
270 * Returns 0 on success, -errno otherwise.
272 static u32
hisi_lpc_comm_ins(void *hostdata
, unsigned long pio
, void *buffer
,
273 size_t dwidth
, unsigned int count
)
275 struct hisi_lpc_dev
*lpcdev
= hostdata
;
276 unsigned char *buf
= buffer
;
277 struct lpc_cycle_para iopara
;
280 if (!lpcdev
|| !buf
|| !count
|| !dwidth
|| dwidth
> LPC_MAX_DWIDTH
)
285 iopara
.opflags
|= FG_INCRADDR_LPC
;
286 iopara
.csize
= dwidth
;
288 addr
= hisi_lpc_pio_to_addr(lpcdev
, pio
);
293 ret
= hisi_lpc_target_in(lpcdev
, &iopara
, addr
, buf
, dwidth
);
303 * hisi_lpc_comm_outs - output the data in the buffer in multiple operations
304 * @hostdata: pointer to the device information relevant to LPC controller
305 * @pio: the target I/O port address
306 * @buffer: a buffer where write/output data bytes are stored
307 * @dwidth: the data width required writing to the target I/O port
308 * @count: how many data units whose length is dwidth will be written
310 static void hisi_lpc_comm_outs(void *hostdata
, unsigned long pio
,
311 const void *buffer
, size_t dwidth
,
314 struct hisi_lpc_dev
*lpcdev
= hostdata
;
315 struct lpc_cycle_para iopara
;
316 const unsigned char *buf
= buffer
;
319 if (!lpcdev
|| !buf
|| !count
|| !dwidth
|| dwidth
> LPC_MAX_DWIDTH
)
324 iopara
.opflags
|= FG_INCRADDR_LPC
;
325 iopara
.csize
= dwidth
;
327 addr
= hisi_lpc_pio_to_addr(lpcdev
, pio
);
329 if (hisi_lpc_target_out(lpcdev
, &iopara
, addr
, buf
, dwidth
))
335 static const struct logic_pio_host_ops hisi_lpc_ops
= {
336 .in
= hisi_lpc_comm_in
,
337 .out
= hisi_lpc_comm_out
,
338 .ins
= hisi_lpc_comm_ins
,
339 .outs
= hisi_lpc_comm_outs
,
343 static int hisi_lpc_acpi_xlat_io_res(struct acpi_device
*adev
,
344 struct acpi_device
*host
,
345 struct resource
*res
)
347 unsigned long sys_port
;
348 resource_size_t len
= resource_size(res
);
350 sys_port
= logic_pio_trans_hwaddr(&host
->fwnode
, res
->start
, len
);
351 if (sys_port
== ~0UL)
354 res
->start
= sys_port
;
355 res
->end
= sys_port
+ len
;
361 * Released firmware describes the IO port max address as 0x3fff, which is
362 * the max host bus address. Fixup to a proper range. This will probably
363 * never be fixed in firmware.
365 static void hisi_lpc_acpi_fixup_child_resource(struct device
*hostdev
,
368 if (r
->end
!= 0x3fff)
371 if (r
->start
== 0xe4)
372 r
->end
= 0xe4 + 0x04 - 1;
373 else if (r
->start
== 0x2f8)
374 r
->end
= 0x2f8 + 0x08 - 1;
376 dev_warn(hostdev
, "unrecognised resource %pR to fixup, ignoring\n",
381 * hisi_lpc_acpi_set_io_res - set the resources for a child
382 * @child: the device node to be updated the I/O resource
383 * @hostdev: the device node associated with host controller
384 * @res: double pointer to be set to the address of translated resources
385 * @num_res: pointer to variable to hold the number of translated resources
387 * Returns 0 when successful, and a negative value for failure.
389 * For a given host controller, each child device will have an associated
390 * host-relative address resource. This function will return the translated
391 * logical PIO addresses for each child devices resources.
393 static int hisi_lpc_acpi_set_io_res(struct device
*child
,
394 struct device
*hostdev
,
395 const struct resource
**res
, int *num_res
)
397 struct acpi_device
*adev
;
398 struct acpi_device
*host
;
399 struct resource_entry
*rentry
;
400 LIST_HEAD(resource_list
);
401 struct resource
*resources
;
405 if (!child
|| !hostdev
)
408 host
= to_acpi_device(hostdev
);
409 adev
= to_acpi_device(child
);
411 if (!adev
->status
.present
) {
412 dev_dbg(child
, "device is not present\n");
416 if (acpi_device_enumerated(adev
)) {
417 dev_dbg(child
, "has been enumerated\n");
422 * The following code segment to retrieve the resources is common to
423 * acpi_create_platform_device(), so consider a common helper function
426 count
= acpi_dev_get_resources(adev
, &resource_list
, NULL
, NULL
);
428 dev_dbg(child
, "failed to get resources\n");
429 return count
? count
: -EIO
;
432 resources
= devm_kcalloc(hostdev
, count
, sizeof(*resources
),
435 dev_warn(hostdev
, "could not allocate memory for %d resources\n",
437 acpi_dev_free_resource_list(&resource_list
);
441 list_for_each_entry(rentry
, &resource_list
, node
) {
442 resources
[count
] = *rentry
->res
;
443 hisi_lpc_acpi_fixup_child_resource(hostdev
, &resources
[count
]);
447 acpi_dev_free_resource_list(&resource_list
);
449 /* translate the I/O resources */
450 for (i
= 0; i
< count
; i
++) {
453 if (!(resources
[i
].flags
& IORESOURCE_IO
))
455 ret
= hisi_lpc_acpi_xlat_io_res(adev
, host
, &resources
[i
]);
457 dev_err(child
, "translate IO range %pR failed (%d)\n",
468 static int hisi_lpc_acpi_remove_subdev(struct device
*dev
, void *unused
)
470 platform_device_unregister(to_platform_device(dev
));
474 struct hisi_lpc_acpi_cell
{
481 static void hisi_lpc_acpi_remove(struct device
*hostdev
)
483 struct acpi_device
*adev
= ACPI_COMPANION(hostdev
);
484 struct acpi_device
*child
;
486 device_for_each_child(hostdev
, NULL
, hisi_lpc_acpi_remove_subdev
);
488 list_for_each_entry(child
, &adev
->children
, node
)
489 acpi_device_clear_enumerated(child
);
493 * hisi_lpc_acpi_probe - probe children for ACPI FW
494 * @hostdev: LPC host device pointer
496 * Returns 0 when successful, and a negative value for failure.
498 * Create a platform device per child, fixing up the resources
499 * from bus addresses to Logical PIO addresses.
502 static int hisi_lpc_acpi_probe(struct device
*hostdev
)
504 struct acpi_device
*adev
= ACPI_COMPANION(hostdev
);
505 struct acpi_device
*child
;
508 /* Only consider the children of the host */
509 list_for_each_entry(child
, &adev
->children
, node
) {
510 const char *hid
= acpi_device_hid(child
);
511 const struct hisi_lpc_acpi_cell
*cell
;
512 struct platform_device
*pdev
;
513 const struct resource
*res
;
517 ret
= hisi_lpc_acpi_set_io_res(&child
->dev
, &adev
->dev
, &res
,
520 dev_warn(hostdev
, "set resource fail (%d)\n", ret
);
524 cell
= (struct hisi_lpc_acpi_cell
[]){
528 .name
= "hisi-lpc-ipmi",
530 /* 8250-compatible uart */
533 .name
= "serial8250",
534 .pdata
= (struct plat_serial8250_port
[]) {
536 .iobase
= res
->start
,
539 .flags
= UPF_BOOT_AUTOCONF
,
544 sizeof(struct plat_serial8250_port
),
549 for (; cell
&& cell
->name
; cell
++) {
550 if (!strcmp(cell
->hid
, hid
)) {
558 "could not find cell for child device (%s), discarding\n",
563 pdev
= platform_device_alloc(cell
->name
, PLATFORM_DEVID_AUTO
);
569 pdev
->dev
.parent
= hostdev
;
570 ACPI_COMPANION_SET(&pdev
->dev
, child
);
572 ret
= platform_device_add_resources(pdev
, res
, num_res
);
576 ret
= platform_device_add_data(pdev
, cell
->pdata
,
581 ret
= platform_device_add(pdev
);
585 acpi_device_set_enumerated(child
);
591 hisi_lpc_acpi_remove(hostdev
);
595 static const struct acpi_device_id hisi_lpc_acpi_match
[] = {
600 static int hisi_lpc_acpi_probe(struct device
*dev
)
605 static void hisi_lpc_acpi_remove(struct device
*hostdev
)
608 #endif // CONFIG_ACPI
611 * hisi_lpc_probe - the probe callback function for hisi lpc host,
612 * will finish all the initialization.
613 * @pdev: the platform device corresponding to hisi lpc host
615 * Returns 0 on success, non-zero on fail.
617 static int hisi_lpc_probe(struct platform_device
*pdev
)
619 struct device
*dev
= &pdev
->dev
;
620 struct acpi_device
*acpi_device
= ACPI_COMPANION(dev
);
621 struct logic_pio_hwaddr
*range
;
622 struct hisi_lpc_dev
*lpcdev
;
623 resource_size_t io_end
;
624 struct resource
*res
;
627 lpcdev
= devm_kzalloc(dev
, sizeof(*lpcdev
), GFP_KERNEL
);
631 spin_lock_init(&lpcdev
->cycle_lock
);
633 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
634 lpcdev
->membase
= devm_ioremap_resource(dev
, res
);
635 if (IS_ERR(lpcdev
->membase
))
636 return PTR_ERR(lpcdev
->membase
);
638 range
= devm_kzalloc(dev
, sizeof(*range
), GFP_KERNEL
);
642 range
->fwnode
= dev
->fwnode
;
643 range
->flags
= LOGIC_PIO_INDIRECT
;
644 range
->size
= PIO_INDIRECT_SIZE
;
645 range
->hostdata
= lpcdev
;
646 range
->ops
= &hisi_lpc_ops
;
647 lpcdev
->io_host
= range
;
649 ret
= logic_pio_register_range(range
);
651 dev_err(dev
, "register IO range failed (%d)!\n", ret
);
655 /* register the LPC host PIO resources */
657 ret
= hisi_lpc_acpi_probe(dev
);
659 ret
= of_platform_populate(dev
->of_node
, NULL
, NULL
, dev
);
661 logic_pio_unregister_range(range
);
665 dev_set_drvdata(dev
, lpcdev
);
667 io_end
= lpcdev
->io_host
->io_start
+ lpcdev
->io_host
->size
;
668 dev_info(dev
, "registered range [%pa - %pa]\n",
669 &lpcdev
->io_host
->io_start
, &io_end
);
674 static int hisi_lpc_remove(struct platform_device
*pdev
)
676 struct device
*dev
= &pdev
->dev
;
677 struct acpi_device
*acpi_device
= ACPI_COMPANION(dev
);
678 struct hisi_lpc_dev
*lpcdev
= dev_get_drvdata(dev
);
679 struct logic_pio_hwaddr
*range
= lpcdev
->io_host
;
682 hisi_lpc_acpi_remove(dev
);
684 of_platform_depopulate(dev
);
686 logic_pio_unregister_range(range
);
691 static const struct of_device_id hisi_lpc_of_match
[] = {
692 { .compatible
= "hisilicon,hip06-lpc", },
693 { .compatible
= "hisilicon,hip07-lpc", },
697 static struct platform_driver hisi_lpc_driver
= {
700 .of_match_table
= hisi_lpc_of_match
,
701 .acpi_match_table
= ACPI_PTR(hisi_lpc_acpi_match
),
703 .probe
= hisi_lpc_probe
,
704 .remove
= hisi_lpc_remove
,
706 builtin_platform_driver(hisi_lpc_driver
);